#!/bin/bash
echo "Построение дерева каталогов для каждого проекта и копирование файлов лицензии."
# отсортированный список файлов и каталогов
function list_directory_contents {
  # сначала заглавные буквы, потом строчные, сначала каталоги, потом файлы
  eval "LC_COLLATE=C ls -A --group-directories-first $exclusions $1"
}
# дерево каталогов со ссылками
function directory_tree {
  # аргументы
  local path="$1"
  local head="$2"
  local tail="$3"
  # префикс для текущего элемента
  if [ "one" == "$4" ]; then
    echo -n "/"
  else
    echo -ne "\n$head"
  fi
  # текущий элемент дерева
  echo -n "<a href='${path#*/}'>${path##*/}</a>"
  # рекурсивные вызовы для подкаталогов
  if [ -d "$path" ]; then
    local list # массив файлов и каталогов
    readarray -t list <<<"$(list_directory_contents "$path")"
    local len=${#list[@]} # размер массива
    local i # счётчик
    for ((i = 0; i < len; i++)); do
      if [ -z "${list[$i]}" ]; then
        continue # пропустить пустой каталог
      elif ((len == 1)); then
        directory_tree "$path/${list[$i]}" "$tail" "$tail" "one"
      elif ((i < len - 1)); then
        directory_tree "$path/${list[$i]}" "$tail├─ " "$tail│  "
      else
        directory_tree "$path/${list[$i]}" "$tail└─ " "$tail   "
      fi
    done
  fi
}
cd .. # выходим из папки в корень репозитория
basedir=$(pwd) # текущий репозиторий
currentTimeMillis=$(date '+%s%3N')
# обходим все репозитории, расположенные на одном уровне с текущим
find .. -mindepth 1 -maxdepth 1 -type d | sort -r | while read -r dir; do
  echo "Обработка: $dir"
  # заходим в каталог, иначе пропускаем итерацию
  cd "$dir" || continue
  # строка исключений для 'ls' из списка '.gitignore' — неотслеживаемые файлы
  exclusions="-I \".git\" $(sed 's/^/ -I "/;s/$/"/' .gitignore | tr -d '\n')"
  # помещаем дерево в контейнер, добавляем заголовок и выводим в файл
  {
    echo "## Дерево каталогов"
    echo -ne "\n<pre>"
    directory_tree .
    echo -e "\n</pre>"
  } >DIRECTORY_TREE.md
  # копирование файлов из этого репозитория во все остальные
  if [ "${dir##*/}" != "${basedir##*/}" ]; then
    rm CONTRIBUTING.md
    rm ./*LICENSE*
    cp "$basedir"/CONTRIBUTING.md .
    cp "$basedir"/*LICENSE* .
  fi
done
echo "Время выполнения: $(("$(date '+%s%3N')" - "$currentTimeMillis")) мс."
